ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ сСтСвых ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ

Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ ΠΈ срСдства внСдрСния Π²ΠΈΠ·ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ для ΠΎΡ€Π³Π°Π½ΠΈΠ·Π°Ρ†ΠΈΠΈ GUI-интСрфСйсов ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ

ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ сСтСвых ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ

Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠ°Π½ΠΈΠ΅ Π»Π΅ΠΊΡ†ΠΈΠΈ

  • АрхитСктура «МодСль-ΠŸΡ€Π΅Π΄ΡΡ‚Π°Π²Π»Π΅Π½ΠΈΠ΅-ΠšΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€Β» (MVC)
  • Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ графичСского интСрфСйса ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ встроСнных классов
  • ΠšΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ ΠΈ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Ρ‹
  • ИспользованиС элСмСнтов управлСния, ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€ΠΎΠ² ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΊΠΈ ΠΈ мСню
  • Π­Π»Π΅ΠΌΠ΅Π½Ρ‚Ρ‹ управлСния
  • ΠžΡΠ½ΠΎΠ²Π½Ρ‹Π΅ понятия
  • Π”ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΈ ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅ элСмСнтов управлСния
  • Π Π΅Π°Π³ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π½Π° элСмСнты управлСния
  • ΠŸΠΎΠ½ΡΡ‚ΠΈΠ΅ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€Π° ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΊΠΈ
  • Π Π°Π±ΠΎΡ‚Π° с мСню ΠΈ Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²Ρ‹ΠΌΠΈ ΠΎΠΊΠ½Π°ΠΌΠΈ
  • ΠžΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° событий
  • МодСль дСлСгирования событий
Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ ΠΈ срСдства внСдрСния Π²ΠΈΠ·ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ для ΠΎΡ€Π³Π°Π½ΠΈΠ·Π°Ρ†ΠΈΠΈ GUI-интСрфСйсов ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ
ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ сСтСвых ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ

АрхитСктура «МодСль-ΠŸΡ€Π΅Π΄ΡΡ‚Π°Π²Π»Π΅Π½ΠΈΠ΅-ΠšΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€Β» (MVC)

ΠžΡΠ½ΠΎΠ²Π½Ρ‹Π΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹

  • МодСль (Model) - Π΄Π°Π½Π½Ρ‹Π΅ ΠΈ бизнСс-Π»ΠΎΠ³ΠΈΠΊΠ°
  • ΠŸΡ€Π΅Π΄ΡΡ‚Π°Π²Π»Π΅Π½ΠΈΠ΅ (View) - Π²ΠΈΠ·ΡƒΠ°Π»ΡŒΠ½ΠΎΠ΅ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Ρ…
  • ΠšΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€ (Controller) - ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ Π²Π²ΠΎΠ΄Π°

ΠŸΡ€Π΅ΠΈΠΌΡƒΡ‰Π΅ΡΡ‚Π²Π° MVC

  • Π Π°Π·Π΄Π΅Π»Π΅Π½ΠΈΠ΅ отвСтствСнности
  • ΠŸΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎΠ΅ использованиС ΠΊΠΎΠ΄Π°
  • Π£ΠΏΡ€ΠΎΡ‰Π΅Π½ΠΈΠ΅ тСстирования
  • Π“ΠΈΠ±ΠΊΠΎΡΡ‚ΡŒ Π² ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ интСрфСйса
Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ ΠΈ срСдства внСдрСния Π²ΠΈΠ·ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ для ΠΎΡ€Π³Π°Π½ΠΈΠ·Π°Ρ†ΠΈΠΈ GUI-интСрфСйсов ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ
ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ сСтСвых ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ

MVC Π² Qt

Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ ΠΈ срСдства внСдрСния Π²ΠΈΠ·ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ для ΠΎΡ€Π³Π°Π½ΠΈΠ·Π°Ρ†ΠΈΠΈ GUI-интСрфСйсов ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ
ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ сСтСвых ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ

Model/View Architecture

// МодСль - Ρ…Ρ€Π°Π½ΠΈΡ‚ Π΄Π°Π½Π½Ρ‹Π΅
class MyModel : public QAbstractTableModel {
    Q_OBJECT
    
private:
    QList<QPair<QString, int>> data;
    
public:
    int rowCount(const QModelIndex &parent = QModelIndex()) const override {
        return data.size();
    }
    
    int columnCount(const QModelIndex &parent = QModelIndex()) const override {
        return 2;
    }
    
    QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override {
        if (!index.isValid() || role != Qt::DisplayRole)
            return QVariant();
            
        if (index.column() == 0)
            return data[index.row()].first;
        else
            return data[index.row()].second;
    }
};
Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ ΠΈ срСдства внСдрСния Π²ΠΈΠ·ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ для ΠΎΡ€Π³Π°Π½ΠΈΠ·Π°Ρ†ΠΈΠΈ GUI-интСрфСйсов ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ
ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ сСтСвых ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ

Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ GUI прилоТСния

#include <QApplication>
#include <QWidget>
#include <QPushButton>
#include <QVBoxLayout>
#include <QLabel>

int main(int argc, char *argv[]) {
    QApplication app(argc, argv);
    
    // Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Π³Π»Π°Π²Π½ΠΎΠ³ΠΎ ΠΎΠΊΠ½Π°
    QWidget window;
    window.setWindowTitle("МоС ΠΏΠ΅Ρ€Π²ΠΎΠ΅ GUI ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅");
    window.resize(400, 300);
    
    // Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ элСмСнтов управлСния
    QLabel* label = new QLabel("ΠŸΡ€ΠΈΠ²Π΅Ρ‚, Qt!");
    QPushButton* button = new QPushButton("НаТми мСня");
    
    // Компоновка
    QVBoxLayout* layout = new QVBoxLayout;
    layout->addWidget(label);
    layout->addWidget(button);
    
    window.setLayout(layout);
    window.show();
    
    return app.exec();
}
Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ ΠΈ срСдства внСдрСния Π²ΠΈΠ·ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ для ΠΎΡ€Π³Π°Π½ΠΈΠ·Π°Ρ†ΠΈΠΈ GUI-интСрфСйсов ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ
ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ сСтСвых ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ

ΠžΡΠ½ΠΎΠ²Π½Ρ‹Π΅ классы Qt GUI

Π‘Π°Π·ΠΎΠ²Ρ‹Π΅ классы ΠΎΠΊΠΎΠ½

Класс НазначСниС
QWidget Π‘Π°Π·ΠΎΠ²Ρ‹ΠΉ класс всСх GUI элСмСнтов
QMainWindow Π“Π»Π°Π²Π½ΠΎΠ΅ ΠΎΠΊΠ½ΠΎ прилоТСния с мСню ΠΈ панСлями инструмСнтов
QDialog Π”ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²ΠΎΠ΅ ΠΎΠΊΠ½ΠΎ для взаимодСйствия с ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ
QFrame ΠšΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ с Ρ€Π°ΠΌΠΊΠΎΠΉ
QScrollArea ΠžΠ±Π»Π°ΡΡ‚ΡŒ с полосами ΠΏΡ€ΠΎΠΊΡ€ΡƒΡ‚ΠΊΠΈ
Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ ΠΈ срСдства внСдрСния Π²ΠΈΠ·ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ для ΠΎΡ€Π³Π°Π½ΠΈΠ·Π°Ρ†ΠΈΠΈ GUI-интСрфСйсов ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ
ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ сСтСвых ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ

ΠšΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ ΠΈ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Ρ‹

#include <QLineEdit>
#include <QTextEdit>
#include <QComboBox>
#include <QCheckBox>
#include <QRadioButton>
#include <QSlider>
#include <QProgressBar>

class WidgetsExample : public QWidget {
    Q_OBJECT
    
public:
    WidgetsExample(QWidget* parent = nullptr) : QWidget(parent) {
        // ВСкстовыС поля
        QLineEdit* lineEdit = new QLineEdit(this);
        lineEdit->setPlaceholderText("Π’Π²Π΅Π΄ΠΈΡ‚Π΅ тСкст...");
        
        QTextEdit* textEdit = new QTextEdit(this);
        textEdit->setPlainText("ΠœΠ½ΠΎΠ³ΠΎΡΡ‚Ρ€ΠΎΡ‡Π½Ρ‹ΠΉ тСкст");
        
        // Π’Ρ‹ΠΏΠ°Π΄Π°ΡŽΡ‰ΠΈΠΉ список
        QComboBox* comboBox = new QComboBox(this);
        comboBox->addItems({"Π’Π°Ρ€ΠΈΠ°Π½Ρ‚ 1", "Π’Π°Ρ€ΠΈΠ°Π½Ρ‚ 2", "Π’Π°Ρ€ΠΈΠ°Π½Ρ‚ 3"});
        
        // Π€Π»Π°ΠΆΠΊΠΈ ΠΈ ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π°Ρ‚Π΅Π»ΠΈ
        QCheckBox* checkBox = new QCheckBox("БогласСн", this);
        QRadioButton* radio1 = new QRadioButton("ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ", this);
        QRadioButton* radio2 = new QRadioButton("Π’Ρ‚ΠΎΡ€ΠΎΠΉ", this);
    }
};
Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ ΠΈ срСдства внСдрСния Π²ΠΈΠ·ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ для ΠΎΡ€Π³Π°Π½ΠΈΠ·Π°Ρ†ΠΈΠΈ GUI-интСрфСйсов ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ
ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ сСтСвых ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ

ΠœΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€Ρ‹ ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΊΠΈ (Layout Managers)

#include <QHBoxLayout>
#include <QVBoxLayout>
#include <QGridLayout>
#include <QFormLayout>
#include <QStackedLayout>

class LayoutsExample : public QWidget {
    Q_OBJECT
    
public:
    LayoutsExample(QWidget* parent = nullptr) : QWidget(parent) {
        // Π“ΠΎΡ€ΠΈΠ·ΠΎΠ½Ρ‚Π°Π»ΡŒΠ½Π°Ρ ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΊΠ°
        QHBoxLayout* hLayout = new QHBoxLayout;
        hLayout->addWidget(new QPushButton("Кнопка 1"));
        hLayout->addWidget(new QPushButton("Кнопка 2"));
        hLayout->addStretch(); // РастяТка
        
        // Π’Π΅Ρ€Ρ‚ΠΈΠΊΠ°Π»ΡŒΠ½Π°Ρ ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΊΠ°
        QVBoxLayout* vLayout = new QVBoxLayout;
        vLayout->addWidget(new QLabel("ΠœΠ΅Ρ‚ΠΊΠ°"));
        vLayout->addWidget(new QLineEdit);
        vLayout->addSpacing(20); // ΠŸΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΠΊ
        vLayout->addLayout(hLayout);
        
        setLayout(vLayout);
    }
};
Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ ΠΈ срСдства внСдрСния Π²ΠΈΠ·ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ для ΠΎΡ€Π³Π°Π½ΠΈΠ·Π°Ρ†ΠΈΠΈ GUI-интСрфСйсов ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ
ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ сСтСвых ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ

GridLayout - табличная ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΊΠ°

#include <QGridLayout>

class GridLayoutExample : public QWidget {
    Q_OBJECT
    
public:
    GridLayoutExample(QWidget* parent = nullptr) : QWidget(parent) {
        QGridLayout* grid = new QGridLayout;
        
        // Π”ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ элСмСнтов Π² сСтку
        grid->addWidget(new QLabel("Имя:"), 0, 0);
        grid->addWidget(new QLineEdit, 0, 1);
        
        grid->addWidget(new QLabel("Ѐамилия:"), 1, 0);
        grid->addWidget(new QLineEdit, 1, 1);
        
        grid->addWidget(new QLabel("Возраст:"), 2, 0);
        grid->addWidget(new QSpinBox, 2, 1);
        
        // ОбъСдинСниС ячССк
        QPushButton* okButton = new QPushButton("OK");
        QPushButton* cancelButton = new QPushButton("ΠžΡ‚ΠΌΠ΅Π½Π°");
        
        grid->addWidget(okButton, 3, 0);
        grid->addWidget(cancelButton, 3, 1);
        
        // Установка отступов
        grid->setHorizontalSpacing(10);
        grid->setVerticalSpacing(10);
        grid->setContentsMargins(20, 20, 20, 20);
        
        setLayout(grid);
    }
};
Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ ΠΈ срСдства внСдрСния Π²ΠΈΠ·ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ для ΠΎΡ€Π³Π°Π½ΠΈΠ·Π°Ρ†ΠΈΠΈ GUI-интСрфСйсов ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ
ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ сСтСвых ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ

FormLayout - ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΊΠ° Ρ„ΠΎΡ€ΠΌ

#include <QFormLayout>

class FormLayoutExample : public QWidget {
    Q_OBJECT
    
public:
    FormLayoutExample(QWidget* parent = nullptr) : QWidget(parent) {
        QFormLayout* formLayout = new QFormLayout;
        
        // Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΏΠΎΠ»Π΅ΠΉ Ρ„ΠΎΡ€ΠΌΡ‹
        QLineEdit* nameEdit = new QLineEdit;
        QLineEdit* emailEdit = new QLineEdit;
        QSpinBox* ageSpinBox = new QSpinBox;
        QComboBox* countryCombo = new QComboBox;
        
        countryCombo->addItems({"Россия", "Π‘Π΅Π»Π°Ρ€ΡƒΡΡŒ", "Π£ΠΊΡ€Π°ΠΈΠ½Π°", "ΠšΠ°Π·Π°Ρ…ΡΡ‚Π°Π½"});
        
        // Π”ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ строк Ρ„ΠΎΡ€ΠΌΡ‹
        formLayout->addRow("Имя:", nameEdit);
        formLayout->addRow("Email:", emailEdit);
        formLayout->addRow("Возраст:", ageSpinBox);
        formLayout->addRow("Π‘Ρ‚Ρ€Π°Π½Π°:", countryCombo);
        
        // Π”ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΊΠ½ΠΎΠΏΠΎΠΊ
        QPushButton* submitButton = new QPushButton("ΠžΡ‚ΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ");
        QPushButton* resetButton = new QPushButton("Π‘Π±Ρ€ΠΎΡΠΈΡ‚ΡŒ");
        
        QHBoxLayout* buttonLayout = new QHBoxLayout;
        buttonLayout->addWidget(submitButton);
        buttonLayout->addWidget(resetButton);
        
        formLayout->addRow(buttonLayout);
        
        setLayout(formLayout);
        setWindowTitle("Π€ΠΎΡ€ΠΌΠ° рСгистрации");
    }
};
Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ ΠΈ срСдства внСдрСния Π²ΠΈΠ·ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ для ΠΎΡ€Π³Π°Π½ΠΈΠ·Π°Ρ†ΠΈΠΈ GUI-интСрфСйсов ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ
ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ сСтСвых ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ

Π Π°Π±ΠΎΡ‚Π° с мСню

#include <QMainWindow>
#include <QMenuBar>
#include <QMenu>
#include <QAction>
#include <QStatusBar>

class MainWindow : public QMainWindow {
    Q_OBJECT
    
public:
    MainWindow(QWidget* parent = nullptr) : QMainWindow(parent) {
        createMenuBar();
        createStatusBar();
        setWindowTitle("ΠŸΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ с мСню");
        resize(800, 600);
    }
    
private:
    void createMenuBar() {
        // БозданиС мСню "Ѐайл"
        QMenu* fileMenu = menuBar()->addMenu("Π€Π°ΠΉΠ»");
        
        // Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ дСйствий
        QAction* newAction = new QAction("Новый", this);
        newAction->setShortcut(QKeySequence::New);
        newAction->setStatusTip("Π‘ΠΎΠ·Π΄Π°Ρ‚ΡŒ Π½ΠΎΠ²Ρ‹ΠΉ Ρ„Π°ΠΉΠ»");
        
        QAction* openAction = new QAction("ΠžΡ‚ΠΊΡ€Ρ‹Ρ‚ΡŒ...", this);
        openAction->setShortcut(QKeySequence::Open);
        
        QAction* saveAction = new QAction("Π‘ΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ", this);
        saveAction->setShortcut(QKeySequence::Save);
        
        QAction* exitAction = new QAction("Π’Ρ‹Ρ…ΠΎΠ΄", this);
        exitAction->setShortcut(QKeySequence::Quit);
        
        // Π”ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ дСйствий Π² мСню
        fileMenu->addAction(newAction);
        fileMenu->addAction(openAction);
        fileMenu->addAction(saveAction);
        fileMenu->addSeparator();
        fileMenu->addAction(exitAction);
        
        // ΠŸΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ сигналов
        connect(exitAction, &QAction::triggered, this, &QMainWindow::close);
    }
    
    void createStatusBar() {
        statusBar()->showMessage("Π“ΠΎΡ‚ΠΎΠ²ΠΎ");
    }
};
Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ ΠΈ срСдства внСдрСния Π²ΠΈΠ·ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ для ΠΎΡ€Π³Π°Π½ΠΈΠ·Π°Ρ†ΠΈΠΈ GUI-интСрфСйсов ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ
ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ сСтСвых ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ

ПанСли инструмСнтов ΠΈ ΠΏΠ°Π½Π΅Π»ΠΈ состояния

#include <QToolBar>
#include <QStatusBar>
#include <QIcon>

class ToolbarExample : public QMainWindow {
    Q_OBJECT
    
public:
    ToolbarExample(QWidget* parent = nullptr) : QMainWindow(parent) {
        // Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΏΠ°Π½Π΅Π»ΠΈ инструмСнтов
        QToolBar* fileToolbar = addToolBar("Π€Π°ΠΉΠ»");
        
        // Π”ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ дСйствий Π½Π° панСль инструмСнтов
        QAction* newAction = new QAction(QIcon(":/icons/new.png"), "Новый", this);
        QAction* openAction = new QAction(QIcon(":/icons/open.png"), "ΠžΡ‚ΠΊΡ€Ρ‹Ρ‚ΡŒ", this);
        QAction* saveAction = new QAction(QIcon(":/icons/save.png"), "Π‘ΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ", this);
        
        fileToolbar->addAction(newAction);
        fileToolbar->addAction(openAction);
        fileToolbar->addAction(saveAction);
        fileToolbar->addSeparator();
        
        // Кнопка с Π²Ρ‹ΠΏΠ°Π΄Π°ΡŽΡ‰ΠΈΠΌ мСню
        QToolButton* toolButton = new QToolButton(this);
        toolButton->setText("Π˜Π½ΡΡ‚Ρ€ΡƒΠΌΠ΅Π½Ρ‚Ρ‹");
        toolButton->setPopupMode(QToolButton::MenuButtonPopup);
        
        QMenu* toolMenu = new QMenu(this);
        toolMenu->addAction("Π˜Π½ΡΡ‚Ρ€ΡƒΠΌΠ΅Π½Ρ‚ 1");
        toolMenu->addAction("Π˜Π½ΡΡ‚Ρ€ΡƒΠΌΠ΅Π½Ρ‚ 2");
        toolButton->setMenu(toolMenu);
        
        fileToolbar->addWidget(toolButton);
        
        // Бтатус Π±Π°Ρ€
        statusBar()->showMessage("ΠŸΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π·Π°ΠΏΡƒΡ‰Π΅Π½ΠΎ");
        
        // Π”ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€ΠΌΠ°Π½Π΅Π½Ρ‚Π½ΠΎΠ³ΠΎ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Π° Π² статус Π±Π°Ρ€
        QLabel* permanentLabel = new QLabel("Π“ΠΎΡ‚ΠΎΠ²");
        statusBar()->addPermanentWidget(permanentLabel);
    }
};
Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ ΠΈ срСдства внСдрСния Π²ΠΈΠ·ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ для ΠΎΡ€Π³Π°Π½ΠΈΠ·Π°Ρ†ΠΈΠΈ GUI-интСрфСйсов ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ
ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ сСтСвых ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ

Π”ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²Ρ‹Π΅ ΠΎΠΊΠ½Π°

#include <QMessageBox>
#include <QFileDialog>
#include <QInputDialog>
#include <QColorDialog>
#include <QFontDialog>

class DialogsExample : public QWidget {
    Q_OBJECT
    
public slots:
    void showMessageBox() {
        // Π˜Π½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΎΠ½Π½ΠΎΠ΅ сообщСниС
        QMessageBox::information(this, "Π˜Π½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡ", 
                                "ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΡ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½Π° ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ!");
        
        // Вопрос с Π²Ρ‹Π±ΠΎΡ€ΠΎΠΌ
        int reply = QMessageBox::question(this, "ΠŸΠΎΠ΄Ρ‚Π²Π΅Ρ€ΠΆΠ΄Π΅Π½ΠΈΠ΅",
                                        "Π’Ρ‹ ΡƒΠ²Π΅Ρ€Π΅Π½Ρ‹, Ρ‡Ρ‚ΠΎ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ?",
                                        QMessageBox::Yes | QMessageBox::No);
        
        if (reply == QMessageBox::Yes) {
            // ДСйствиС ΠΏΡ€ΠΈ ΠΏΠΎΠ΄Ρ‚Π²Π΅Ρ€ΠΆΠ΄Π΅Π½ΠΈΠΈ
        }
    }
    
    void showFileDialog() {
        // Π”ΠΈΠ°Π»ΠΎΠ³ открытия Ρ„Π°ΠΉΠ»Π°
        QString fileName = QFileDialog::getOpenFileName(
            this,
            "ΠžΡ‚ΠΊΡ€Ρ‹Ρ‚ΡŒ Ρ„Π°ΠΉΠ»",
            "",
            "ВСкстовыС Ρ„Π°ΠΉΠ»Ρ‹ (*.txt);;ВсС Ρ„Π°ΠΉΠ»Ρ‹ (*.*)"
        );
        
        if (!fileName.isEmpty()) {
            // Π Π°Π±ΠΎΡ‚Π° с Ρ„Π°ΠΉΠ»ΠΎΠΌ
        }
    }
};
Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ ΠΈ срСдства внСдрСния Π²ΠΈΠ·ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ для ΠΎΡ€Π³Π°Π½ΠΈΠ·Π°Ρ†ΠΈΠΈ GUI-интСрфСйсов ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ
ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ сСтСвых ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ

ΠŸΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠ΅ Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²Ρ‹Π΅ ΠΎΠΊΠ½Π°

#include <QDialog>
#include <QDialogButtonBox>

class CustomDialog : public QDialog {
    Q_OBJECT
    
private:
    QLineEdit* nameEdit;
    QSpinBox* ageSpinBox;
    QCheckBox* agreeCheckBox;
    
public:
    CustomDialog(QWidget* parent = nullptr) : QDialog(parent) {
        setWindowTitle("ΠŸΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ Π΄ΠΈΠ°Π»ΠΎΠ³");
        setModal(true);
        resize(300, 200);
        
        // Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ элСмСнтов
        nameEdit = new QLineEdit;
        ageSpinBox = new QSpinBox;
        ageSpinBox->setRange(1, 120);
        agreeCheckBox = new QCheckBox("Π― согласСн с условиями");
        
        // Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΊΠ½ΠΎΠΏΠΎΠΊ
        QDialogButtonBox* buttonBox = new QDialogButtonBox(
            QDialogButtonBox::Ok | QDialogButtonBox::Cancel
        );
        
        // ΠŸΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ сигналов
        connect(buttonBox, &QDialogButtonBox::accepted, this, &QDialog::accept);
        connect(buttonBox, &QDialogButtonBox::rejected, this, &QDialog::reject);
        
        // Компоновка
        QFormLayout* layout = new QFormLayout;
        layout->addRow("Имя:", nameEdit);
        layout->addRow("Возраст:", ageSpinBox);
        layout->addRow(agreeCheckBox);
        layout->addRow(buttonBox);
        
        setLayout(layout);
    }
    
    QString getName() const { return nameEdit->text(); }
    int getAge() const { return ageSpinBox->value(); }
    bool isAgreed() const { return agreeCheckBox->isChecked(); }
};
Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ ΠΈ срСдства внСдрСния Π²ΠΈΠ·ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ для ΠΎΡ€Π³Π°Π½ΠΈΠ·Π°Ρ†ΠΈΠΈ GUI-интСрфСйсов ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ
ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ сСтСвых ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ

ΠžΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° событий - Π‘ΠΈΠ³Π½Π°Π»Ρ‹ ΠΈ слоты

#include <QObject>
#include <QDebug>

class EventHandler : public QObject {
    Q_OBJECT
    
public slots:
    void handleButtonClicked() {
        qDebug() << "Кнопка Π½Π°ΠΆΠ°Ρ‚Π°!";
    }
    
    void handleTextChanged(const QString& text) {
        qDebug() << "ВСкст ΠΈΠ·ΠΌΠ΅Π½Π΅Π½:" << text;
    }
    
    void handleValueChanged(int value) {
        qDebug() << "Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΎ:" << value;
    }
};

// ИспользованиС
class WidgetExample : public QWidget {
    Q_OBJECT
    
public:
    WidgetExample(QWidget* parent = nullptr) : QWidget(parent) {
        QPushButton* button = new QPushButton("НаТми мСня", this);
        QLineEdit* lineEdit = new QLineEdit(this);
        QSlider* slider = new QSlider(Qt::Horizontal, this);
        
        EventHandler* handler = new EventHandler(this);
        
        // ΠŸΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ сигналов ΠΊ слотам
        connect(button, &QPushButton::clicked, 
                handler, &EventHandler::handleButtonClicked);
        
        connect(lineEdit, &QLineEdit::textChanged,
                handler, &EventHandler::handleTextChanged);
        
        connect(slider, &QSlider::valueChanged,
                handler, &EventHandler::handleValueChanged);
    }
};
Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ ΠΈ срСдства внСдрСния Π²ΠΈΠ·ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ для ΠΎΡ€Π³Π°Π½ΠΈΠ·Π°Ρ†ΠΈΠΈ GUI-интСрфСйсов ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ
ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ сСтСвых ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ

ΠŸΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠ΅ события

#include <QEvent>
#include <QMouseEvent>
#include <QKeyEvent>

class CustomWidget : public QWidget {
    Q_OBJECT
    
protected:
    // ΠžΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° событий ΠΌΡ‹ΡˆΠΈ
    void mousePressEvent(QMouseEvent* event) override {
        if (event->button() == Qt::LeftButton) {
            qDebug() << "ЛСвая ΠΊΠ½ΠΎΠΏΠΊΠ° ΠΌΡ‹ΡˆΠΈ Π½Π°ΠΆΠ°Ρ‚Π° Π² Ρ‚ΠΎΡ‡ΠΊΠ΅:" 
                     << event->pos();
        }
    }
    
    void mouseMoveEvent(QMouseEvent* event) override {
        qDebug() << "ΠœΡ‹ΡˆΡŒ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π΅Π½Π° Π² Ρ‚ΠΎΡ‡ΠΊΡƒ:" << event->pos();
    }
    
    void mouseReleaseEvent(QMouseEvent* event) override {
        qDebug() << "Кнопка ΠΌΡ‹ΡˆΠΈ ΠΎΡ‚ΠΏΡƒΡ‰Π΅Π½Π°";
    }
    
    // ΠžΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° событий ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Ρ‹
    void keyPressEvent(QKeyEvent* event) override {
        qDebug() << "Клавиша Π½Π°ΠΆΠ°Ρ‚Π°:" << event->key()
                 << "ВСкст:" << event->text();
        
        if (event->key() == Qt::Key_Escape) {
            close();
        }
    }
    
    void keyReleaseEvent(QKeyEvent* event) override {
        qDebug() << "Клавиша ΠΎΡ‚ΠΏΡƒΡ‰Π΅Π½Π°:" << event->key();
    }
    
    // ΠžΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° событий измСнСния Ρ€Π°Π·ΠΌΠ΅Ρ€Π°
    void resizeEvent(QResizeEvent* event) override {
        qDebug() << "Π Π°Π·ΠΌΠ΅Ρ€ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ с" << event->oldSize()
                 << "Π½Π°" << event->size();
    }
};
Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ ΠΈ срСдства внСдрСния Π²ΠΈΠ·ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ для ΠΎΡ€Π³Π°Π½ΠΈΠ·Π°Ρ†ΠΈΠΈ GUI-интСрфСйсов ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ
ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ сСтСвых ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ

Π€ΠΈΠ»ΡŒΡ‚Ρ€Ρ‹ событий

#include <QEvent>
#include <QObject>

class EventFilter : public QObject {
    Q_OBJECT
    
protected:
    bool eventFilter(QObject* obj, QEvent* event) override {
        if (event->type() == QEvent::KeyPress) {
            QKeyEvent* keyEvent = static_cast<QKeyEvent*>(event);
            qDebug() << "Π€ΠΈΠ»ΡŒΡ‚Ρ€: Π½Π°ΠΆΠ°Ρ‚Π° клавиша" << keyEvent->key()
                     << "Π² ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π΅" << obj->objectName();
            
            // Π‘Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ° наТатия клавиши Enter
            if (keyEvent->key() == Qt::Key_Return) {
                return true; // Π‘ΠΎΠ±Ρ‹Ρ‚ΠΈΠ΅ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Π½ΠΎ, дальшС Π½Π΅ ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒ
            }
        }
        
        // Бтандартная ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ°
        return QObject::eventFilter(obj, event);
    }
};

// Установка Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Π°
class FilterExample : public QWidget {
    Q_OBJECT
    
public:
    FilterExample(QWidget* parent = nullptr) : QWidget(parent) {
        QLineEdit* lineEdit1 = new QLineEdit(this);
        QLineEdit* lineEdit2 = new QLineEdit(this);
        
        lineEdit1->setObjectName("lineEdit1");
        lineEdit2->setObjectName("lineEdit2");
        
        EventFilter* filter = new EventFilter(this);
        
        // Установка Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Π° для Π²ΠΈΠ΄ΠΆΠ΅Ρ‚ΠΎΠ²
        lineEdit1->installEventFilter(filter);
        lineEdit2->installEventFilter(filter);
    }
};
Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ ΠΈ срСдства внСдрСния Π²ΠΈΠ·ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ для ΠΎΡ€Π³Π°Π½ΠΈΠ·Π°Ρ†ΠΈΠΈ GUI-интСрфСйсов ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ
ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ сСтСвых ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ

ΠŸΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠ΅ события ΠΈ сигналы

#include <QEvent>
#include <QCoreApplication>

// ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ° события
const QEvent::Type CustomEventType = static_cast<QEvent::Type>(QEvent::User + 1);

class CustomEvent : public QEvent {
private:
    QString message;
    int priority;
    
public:
    CustomEvent(const QString& msg, int prio) 
        : QEvent(CustomEventType), message(msg), priority(prio) {}
    
    QString getMessage() const { return message; }
    int getPriority() const { return priority; }
};

class CustomEventWidget : public QWidget {
    Q_OBJECT
    
signals:
    void customSignal(const QString& message, int value);
    
public:
    CustomEventWidget(QWidget* parent = nullptr) : QWidget(parent) {}
    
    // ΠžΡ‚ΠΏΡ€Π°Π²ΠΊΠ° ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ события
    void sendCustomEvent(const QString& message, int priority) {
        CustomEvent* event = new CustomEvent(message, priority);
        QCoreApplication::postEvent(this, event);
    }
    
protected:
    // ΠžΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ события
    void customEvent(QEvent* event) override {
        if (event->type() == CustomEventType) {
            CustomEvent* customEvent = static_cast<CustomEvent*>(event);
            qDebug() << "ΠŸΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠ΅ событиС:"
                     << customEvent->getMessage()
                     << "ΠŸΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚:" << customEvent->getPriority();
            
            // ГСнСрация сигнала
            emit customSignal(customEvent->getMessage(), 
                            customEvent->getPriority());
        }
    }
};
Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ ΠΈ срСдства внСдрСния Π²ΠΈΠ·ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ для ΠΎΡ€Π³Π°Π½ΠΈΠ·Π°Ρ†ΠΈΠΈ GUI-интСрфСйсов ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ
ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ сСтСвых ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ

Π‘ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Ρ‹ ΠΊ GUI Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅

QML ΠΈ Qt Quick

// main.cpp
#include <QGuiApplication>
#include <QQmlApplicationEngine>

int main(int argc, char *argv[]) {
    QGuiApplication app(argc, argv);
    
    QQmlApplicationEngine engine;
    engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
    
    if (engine.rootObjects().isEmpty())
        return -1;
    
    return app.exec();
}
Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ ΠΈ срСдства внСдрСния Π²ΠΈΠ·ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ для ΠΎΡ€Π³Π°Π½ΠΈΠ·Π°Ρ†ΠΈΠΈ GUI-интСрфСйсов ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ
ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ сСтСвых ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ

QML Ρ€Π°Π·ΠΌΠ΅Ρ‚ΠΊΠ° (main.qml)

import QtQuick 2.15
import QtQuick.Controls 2.15

ApplicationWindow {
    id: window
    visible: true
    width: 640
    height: 480
    title: qsTr("Π‘ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΉ GUI Π½Π° QML")
    
    Rectangle {
        anchors.fill: parent
        gradient: Gradient {
            GradientStop { position: 0.0; color: "#1e3c72" }
            GradientStop { position: 1.0; color: "#2a5298" }
        }
        
        Column {
            anchors.centerIn: parent
            spacing: 20
            
            Text {
                text: qsTr("Π”ΠΎΠ±Ρ€ΠΎ ΠΏΠΎΠΆΠ°Π»ΠΎΠ²Π°Ρ‚ΡŒ Π² Qt Quick!")
                font.pixelSize: 24
                color: "white"
                anchors.horizontalCenter: parent.horizontalCenter
            }
            
            Button {
                text: qsTr("НаТми мСня")
                anchors.horizontalCenter: parent.horizontalCenter
                onClicked: {
                    console.log("Кнопка Π½Π°ΠΆΠ°Ρ‚Π°!")
                }
            }
        }
    }
}
Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ ΠΈ срСдства внСдрСния Π²ΠΈΠ·ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ для ΠΎΡ€Π³Π°Π½ΠΈΠ·Π°Ρ†ΠΈΠΈ GUI-интСрфСйсов ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ
ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ сСтСвых ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ

Π›ΡƒΡ‡ΡˆΠΈΠ΅ ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠΈ GUI Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ

1. АрхитСктурныС ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΡ‹

  • Π Π°Π·Π΄Π΅Π»Π΅Π½ΠΈΠ΅ отвСтствСнности - ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ MVC/MVP
  • ΠœΠΈΠ½ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΡ зависимостСй - слабая ΡΠ²ΡΠ·Π°Π½Π½ΠΎΡΡ‚ΡŒ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ²
  • ΠŸΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎΠ΅ использованиС - создавайтС ΠΏΠ΅Ρ€Π΅ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Π΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹
Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ ΠΈ срСдства внСдрСния Π²ΠΈΠ·ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ для ΠΎΡ€Π³Π°Π½ΠΈΠ·Π°Ρ†ΠΈΠΈ GUI-интСрфСйсов ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ
ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ сСтСвых ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ

2. ΠŸΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ

// ИспользованиС setUpdatesEnabled для Π³Ρ€ΡƒΠΏΠΏΠΎΠ²Ρ‹Ρ… ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠΉ
void updateMultipleWidgets() {
    setUpdatesEnabled(false);
    
    // ΠœΠ½ΠΎΠΆΠ΅ΡΡ‚Π²Π΅Π½Π½Ρ‹Π΅ измСнСния
    label1->setText("Новый тСкст 1");
    label2->setText("Новый тСкст 2");
    progressBar->setValue(50);
    
    setUpdatesEnabled(true);
}
Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ ΠΈ срСдства внСдрСния Π²ΠΈΠ·ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ для ΠΎΡ€Π³Π°Π½ΠΈΠ·Π°Ρ†ΠΈΠΈ GUI-интСрфСйсов ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ
ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ сСтСвых ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ

3. ΠŸΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ ΠΎΠΏΡ‹Ρ‚

  • ΠžΡ‚Π·Ρ‹Π²Ρ‡ΠΈΠ²Ρ‹ΠΉ интСрфСйс - ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ ΠΏΠΎΡ‚ΠΎΠΊΠΈ для Π΄Π»ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ
  • Π˜Π½Ρ‚ΡƒΠΈΡ‚ΠΈΠ²Π½ΠΎΡΡ‚ΡŒ - слСдуйтС стандартам интСрфСйса
  • Π”ΠΎΡΡ‚ΡƒΠΏΠ½ΠΎΡΡ‚ΡŒ - ΡƒΡ‡ΠΈΡ‚Ρ‹Π²Π°ΠΉΡ‚Π΅ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ с ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π½Ρ‹ΠΌΠΈ возмоТностями
Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ ΠΈ срСдства внСдрСния Π²ΠΈΠ·ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ для ΠΎΡ€Π³Π°Π½ΠΈΠ·Π°Ρ†ΠΈΠΈ GUI-интСрфСйсов ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ
ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ сСтСвых ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ

РСзюмС

ΠšΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ†ΠΈΠΈ

  • АрхитСктура MVC - основа ΠΎΡ€Π³Π°Π½ΠΈΠ·Π°Ρ†ΠΈΠΈ GUI ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ
  • Π‘ΠΈΠ³Π½Π°Π»Ρ‹ ΠΈ слоты - ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ взаимодСйствия ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ²
  • ΠœΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€Ρ‹ ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΊΠΈ - автоматичСскоС Ρ€Π°Π·ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠ΅ элСмСнтов
  • ΠžΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° событий - рСакция Π½Π° дСйствия ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ
  • Π”ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²Ρ‹Π΅ ΠΎΠΊΠ½Π° - взаимодСйствиС с ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ
Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ ΠΈ срСдства внСдрСния Π²ΠΈΠ·ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ для ΠΎΡ€Π³Π°Π½ΠΈΠ·Π°Ρ†ΠΈΠΈ GUI-интСрфСйсов ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ
ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ сСтСвых ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ

Π˜Π½ΡΡ‚Ρ€ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ Qt для GUI

  • QWidget - Π±Π°Π·ΠΎΠ²Ρ‹ΠΉ класс всСх элСмСнтов интСрфСйса
  • QLayout - систСма ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΊΠΈ
  • QMainWindow - Π³Π»Π°Π²Π½ΠΎΠ΅ ΠΎΠΊΠ½ΠΎ прилоТСния
  • QDialog - Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²Ρ‹Π΅ ΠΎΠΊΠ½Π°
  • Π‘ΠΈΠ³Π½Π°Π»Ρ‹ ΠΈ слоты - ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ событий
Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ ΠΈ срСдства внСдрСния Π²ΠΈΠ·ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ для ΠΎΡ€Π³Π°Π½ΠΈΠ·Π°Ρ†ΠΈΠΈ GUI-интСрфСйсов ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ
ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ сСтСвых ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ

Π”Π°Π»ΡŒΠ½Π΅ΠΉΡˆΠ΅Π΅ ΠΈΠ·ΡƒΡ‡Π΅Π½ΠΈΠ΅

  • QML ΠΈ Qt Quick - соврСмСнныС Ρ‚Π΅Ρ…Π½ΠΎΠ»ΠΎΠ³ΠΈΠΈ GUI
  • Анимации ΠΈ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄Ρ‹ - ΡƒΠ»ΡƒΡ‡ΡˆΠ΅Π½ΠΈΠ΅ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ ΠΎΠΏΡ‹Ρ‚Π°
  • ΠšΠ°ΡΡ‚ΠΎΠΌΠ½Ρ‹Π΅ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Ρ‹ - созданиС ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹Ρ… ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ²
  • Π˜Π½Ρ‚Π΅Ρ€Π½Π°Ρ†ΠΈΠΎΠ½Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡ - ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° многоязычности
  • ВСстированиС GUI - Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ΅ тСстированиС интСрфСйса
Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ ΠΈ срСдства внСдрСния Π²ΠΈΠ·ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ для ΠΎΡ€Π³Π°Π½ΠΈΠ·Π°Ρ†ΠΈΠΈ GUI-интСрфСйсов ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ
ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ сСтСвых ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ

Вопросы для самопровСрки

  1. Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π° MVC ΠΈ ΠΊΠ°ΠΊ ΠΎΠ½Π° Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π° Π² Qt?
  2. КакиС ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ Ρ‚ΠΈΠΏΡ‹ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€ΠΎΠ² ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΊΠΈ ΠΈ ΠΊΠΎΠ³Π΄Π° ΠΈΡ… ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ?
  3. Как ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ события ΠΊ ΠΊΠ½ΠΎΠΏΠΊΠ΅?
  4. Π§Π΅ΠΌ отличаСтся QMainWindow ΠΎΡ‚ QDialog?
  5. Как ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠ΅ событиС ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Π΅Π³ΠΎ?
  6. КакиС ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ стандартныС Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²Ρ‹Π΅ ΠΎΠΊΠ½Π° Π² Qt?
  7. Как Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Π°Ρ†ΠΈΡŽ событий?
  8. Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ сигналы ΠΈ слоты Π² Qt?
  9. Как ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ мСню ΠΈ панСль инструмСнтов?
  10. КакиС Π»ΡƒΡ‡ΡˆΠΈΠ΅ ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠΈ слСдуСт ΡƒΡ‡ΠΈΡ‚Ρ‹Π²Π°Ρ‚ΡŒ ΠΏΡ€ΠΈ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ GUI?
Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ ΠΈ срСдства внСдрСния Π²ΠΈΠ·ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ для ΠΎΡ€Π³Π°Π½ΠΈΠ·Π°Ρ†ΠΈΠΈ GUI-интСрфСйсов ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ